package models

import (
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo/options"
	l "hospital-srv/basic/inits"
	"time"
)

// 主评论结构体（一级评论）
// 商品评论结构体（一级评论）
type ProductComments struct {
	Id        uint64         `bson:"_id,omitempty" gorm:"column:id;type:bigint UNSIGNED;comment:主键ID;primaryKey;not null;" json:"_id"`                           // 改为 ObjectID 类型                       // 自增主键ID
	ProductId uint64         `bson:"product_id,omitempty" gorm:"column:product_id;type:bigint;comment:关联商品ID;not null;" json:"product_id"`                       // 商品唯一标识
	UserId    uint64         `bson:"user_id,omitempty" gorm:"column:user_id;type:bigint UNSIGNED;comment:评论用户ID;not null;" json:"user_id"`                       // 评论者用户ID
	UserName  string         `bson:"user_name,omitempty" gorm:"column:user_name;type:varchar(64);comment:评论用户昵称;not null;" json:"user_name"`                     // 冗余存储用户名
	Content   string         `bson:"content,omitempty" gorm:"column:content;type:text;comment:评论内容;not null;" json:"content"`                                    // 评论正文
	Rating    int32          `bson:"rating,omitempty" gorm:"column:rating;type:int(1);comment:商品评分(1-5分);check:rating BETWEEN 1 AND 5;not null;" json:"rating"`  // 评分
	CreatedAt time.Time      `bson:"created_at" gorm:"column:created_at;type:datetime(3);comment:创建时间;not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"` // 创建时间 	// 二级回复（gorm:-表示不映射到数据库字段，仅用于MongoDB嵌套）
	Replies   []CommentReply `bson:"replies,omitempty" json:"replies"`                                                                                           // 关联的二级评论
}

// 主评论创建（一级评论）
func (pc *ProductComments) ProductCommentsCreate() error {
	_, err := l.MongoComments.InsertOne(l.Ctx, pc)
	return err
}

// id查找评论详情
func (pc *ProductComments) ProductCommentsDetails() error {
	return l.MongoComments.FindOne(l.Ctx, bson.M{"_id": pc.Id}).Decode(pc)
}

// id查找评论详情
func (pc *ProductComments) ProductCommentsProductIdDetails() error {
	return l.MongoComments.FindOne(l.Ctx, bson.M{"product_id": pc.ProductId}).Decode(pc)
}

// 一级评论展示
func (pc *ProductComments) ProductCommentsFind() ([]*ProductComments, error) {
	find, err := l.MongoComments.Find(l.Ctx, bson.M{"product_id": pc.ProductId})
	if err != nil {
		return nil, err
	}
	var commentList []*ProductComments
	if err = find.All(l.Ctx, &commentList); err != nil {
		return nil, err
	}
	return commentList, nil
}

// 评论回复结构体（二级评论）
type CommentReply struct {
	Id        uint64    `bson:"_id" gorm:"column:id;type:bigint UNSIGNED;comment:回复主键ID;primaryKey;not null;" json:"id"`                                      // 回复自增ID
	CommentId uint64    `bson:"comment_id" gorm:"column:comment_id;type:bigint;comment:关联主评论ID;not null;" json:"comment_id"`                                  // 关联的一级评论ID
	UserId    uint64    `bson:"user_id" gorm:"column:user_id;type:bigint UNSIGNED;comment:回复者用户ID;not null;" json:"user_id"`                                  // 回复者ID
	UserName  string    `bson:"user_name" gorm:"column:user_name;type:varchar(64);comment:回复者昵称;not null;" json:"user_name"`                                  // 回复者昵称
	Content   string    `bson:"content" gorm:"column:content;type:text;comment:回复内容;not null;" json:"content"`                                                // 回复正文
	CreatedAt time.Time `bson:"created_at" gorm:"column:created_at;type:datetime(3);comment:回复创建时间;not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"` // 回复创建时间
	IsDeleted bool      `bson:"is_deleted" gorm:"column:is_deleted;type:tinyint(1);comment:软删除标记;default:0;not null;" json:"is_deleted"`                      // 软删除标记
}

// 评论回复结构体创建（二级评论）
func (cr *CommentReply) CommentReplyCreate() error {
	_, err := l.MongoReply.InsertOne(l.Ctx, &cr, &options.InsertOneOptions{})
	return err
}

// 二级评论展示
func (cr *CommentReply) CommentReplyFind() ([]*CommentReply, error) {
	find, err := l.MongoReply.Find(l.Ctx, bson.M{"comment_id": cr.CommentId})
	if err != nil {
		return nil, err
	}
	var replyList []*CommentReply
	if err = find.All(l.Ctx, &replyList); err != nil {
		return nil, err
	}
	return replyList, nil
}
